﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using Campeonato.Common.BLL;
using Campeonato.Model;
using Newtonsoft.Json;
using PESWeb.HttpHandlers.Model;

namespace PESWeb.HttpHandlers
{
    public class MobileWebRequestHandler : IHttpHandler
    {
        bool IHttpHandler.IsReusable
        {
            get { return true; }
        }

        void IHttpHandler.ProcessRequest(HttpContext _context)
        {
            string path = _context.Request.Path;
            _context.Response.ContentType = "text/html";

            if (_context.Request.RequestType == "GET")
            {
                if (path.Contains("rank.aspx"))
                {
                    string[] ids = _context.Request.Params.GetValues(BaseParametros.ID);
                    if (ids != null)
                    {
                        int campeonatoID;
                        if (int.TryParse(ids[0], out campeonatoID))
                        {
                            IList<Jogador> lstJogadores = CampeonatoBLL.BuscarRankingCampeonato(
                                new Campeonato.Model.Campeonato { ID = campeonatoID });

                            _context.Response.Write(JsonConvert.SerializeObject(lstJogadores));
                            _context.Response.Flush();
                            _context.Response.End();
                        }
                    }
                }
                else if (path.Contains("camp.aspx"))
                {
                    IList<Campeonato.Model.Campeonato> lstCamps =
                        CampeonatoBLL.BuscarTodosCampeonatos();

                    _context.Response.Write(JsonConvert.SerializeObject(lstCamps));
                    _context.Response.Flush();
                    _context.Response.End();
                }
                else if (path.Contains("part.aspx"))
                {
                    string[] fncs = _context.Request.Params.GetValues(BaseParametros.FUNCAO);
                    if (fncs != null)
                    {
                        switch (fncs[0])
                        {
                            case FuncoesPartida.PARTIDAS_DO_DIA:
                                IList<Partida> lstPartidas =
                                PartidaBLL.BuscarTodasPartidasDoDia(DateTime.Now.Date);

                                _context.Response.Write(JsonConvert.SerializeObject(lstPartidas));
                                _context.Response.End();
                                break;

                            case FuncoesPartida.BUSCAR_INFO_PARTIDA:
                                string[] ids = _context.Request.Params.GetValues(BaseParametros.ID);
                                Partida partida = PartidaBLL.BuscarPartida(long.Parse(ids[0]));
                                _context.Response.Write(JsonConvert.SerializeObject(partida));
                                _context.Response.Flush();
                                _context.Response.End();
                                break;
                        }
                    }
                }
                else if (path.Contains("jog.aspx"))
                {
                    string[] fncs = _context.Request.Params.GetValues(BaseParametros.FUNCAO);
                    if (fncs != null)
                    {

                        string[] ids;
                        var jogadoresVirtuais = new List<JogadorVirtual>();
                        switch (fncs[0])
                        {
                            case FuncoesJogador.BUSCAR_JOGADORES_VIRTUAS:
                                ids = _context.Request.Params.GetValues(BaseParametros.ID);                                
                                foreach (string id in ids)
                                {
                                    var jogador = new Jogador{ ID = long.Parse(id) };
                                    jogadoresVirtuais.AddRange(JogadorBLL.BuscarJogadoresVirtuais(jogador));
                                }
                                _context.Response.Write(JsonConvert.SerializeObject(jogadoresVirtuais));
                                _context.Response.Flush();
                                _context.Response.End();
                                break;
                            case FuncoesJogador.BUSCAR_JOGADORES_SUSPENSOS:
                                ids = _context.Request.Params.GetValues(BaseParametros.ID);
                                foreach (string id in ids)
                                {
                                    var jogador = new Jogador{ ID = long.Parse(id) };
                                    jogadoresVirtuais.AddRange(JogadorBLL.BuscarJogadoresSuspensos(jogador));
                                }
                                _context.Response.Write(JsonConvert.SerializeObject(jogadoresVirtuais));
                                _context.Response.Flush();
                                _context.Response.End();
                                break;
                        }
                    }
                }
            }//if get
            else if (_context.Request.RequestType == "POST")
            {
                if (path.Contains("part.aspx"))
                {
                    var stReader = new StreamReader(_context.Request.InputStream);
                    string jsonRequest = stReader.ReadToEnd();
                    var regAcaoPart =
                        JsonConvert.DeserializeObject<RegistroAcaoPartida>(jsonRequest);

                    var regAcaoResp = new RegistroAcaoResposta();

                    try
                    {
                        switch (regAcaoPart.AcaoRealizada)
                        {
                            case TipoAcaoPartida.MarcouGol:
                                regAcaoResp.JogadorVirtualID =
                                    PartidaBLL.AtualizaPartidaAoVivo(regAcaoPart.PartidaID,
                                                                     regAcaoPart.JogadorID, regAcaoPart.JogadorVirtualID,
                                                                     regAcaoPart.JogadorNome, 1, false, false);
                                break;
                            case TipoAcaoPartida.RecebeuCartaoAmarelo:
                                regAcaoResp.JogadorVirtualID =
                                    PartidaBLL.AtualizaPartidaAoVivo(regAcaoPart.PartidaID,
                                                                     regAcaoPart.JogadorID, regAcaoPart.JogadorVirtualID,
                                                                     regAcaoPart.JogadorNome, 0, true, false);
                                break;
                            case TipoAcaoPartida.RecebeuCartaoVermelho:
                                regAcaoResp.JogadorVirtualID =
                                    PartidaBLL.AtualizaPartidaAoVivo(regAcaoPart.PartidaID,
                                                                     regAcaoPart.JogadorID, regAcaoPart.JogadorVirtualID,
                                                                     regAcaoPart.JogadorNome, 0, false, true);
                                break;
                            case TipoAcaoPartida.FimPartida:
                                PartidaBLL.ConfirmaFinalPartida(regAcaoPart.PartidaID);
                                break;
                        }

                        try
                        {
                            PartidaBLL.RegistraTextoPartidaAoVivo(regAcaoPart.PartidaID, regAcaoPart.JogadorID,
                                                                  regAcaoResp.JogadorVirtualID,
                                                                  regAcaoPart.AcaoRealizada);

                        }catch{}//Não pode afetar o resto da lógica.

                        regAcaoResp.Sucesso = true;
                    }
                    catch (Exception ex)
                    {
                        regAcaoResp.Sucesso = false;
                    }

                    stReader.Close();
                    _context.Response.Write(JsonConvert.SerializeObject(regAcaoResp));
                    _context.Response.Flush();
                    _context.Response.End();
                }
            }
        }
    }
}